草庐IT

C++ Templates 多态障碍

全部标签

c++ - 如何通过多重继承实现多态行为?

我从未使用过多重继承,但在最近阅读它时,我开始思考如何在我的代码中实际使用它。当我正常使用多态性时,我通常通过创建声明为基类指针的新派生实例来使用它,例如BaseClass*pObject=newDerivedClass();这样我在派生类上调用虚函数时就能得到正确的多态行为。通过这种方式,我可以拥有不同多态类型的集合,这些类型通过它们的虚函数来管理自己的行为。在考虑使用多重继承时,我在考虑相同的方法,但如果我有以下层次结构,我会怎么做classA{virtualvoidfoo()=0;};classB:publicA{virtualvoidfoo(){//implementation

c++ - 无创多态性

一个简单的C++问题:是否可以根据指针的运行时类型调用一个或另一个函数?例如我有一个类A,类B是A的子类。我想写一个函数f这样f(A*a){//dosomething}f(B*b){//dosomethingelse}//callf()A*a=newA();A*b=newB();f(a);//dosomethingf(b);//dosomething,butI'dlikeitto"dosomethingelse"额外的精度:A和B是在我的代码中定义和实例化的,所以我不能在A和B上使用带有虚函数的常规多态...我知道你可以使用一些RTTI,但有没有更优雅的解决方案?

C++ 非多态接口(interface)

简单地说,您如何在C++中为单级继承创建接口(interface)(出于简单性和教学原因)?我看到一些代码没有使用多态性,但是基类包含一个虚拟抽象方法(virtualvoidTheMethod()=0)。现在用纯虚方法从这个抽象类派生出一个类,但是在后面的代码中,使用派生类的实例完全没有动态分配。这是正确的做法吗?使用多态设计推断出的开销又如何呢?我认为这是不可能的。这看起来更像是隐藏/重影基本方法,即使该方法是纯虚拟方法也是如此。稍后编辑:感谢所有设法提供一些好的答案的人,我想强调一个严重的错误,该错误是由于使用“动态分配”而引起的,其含义是强调这一点对象创建的可能性是唯一与多态性兼

c++ - 静态成员变量如何在 C++ 中表现出多态性?

我想在子类中存储静态字符串,这样它们就不会在内存中重复。可以这样做吗?我希望能够实例化两个IBM,但只将字符串“IBM”放入内存中一次。classCompany{staticconststd::stringcompany_name;}classCocaColaCompany:publicCompany{staticconststd::stringcompany_name="CocaCola";}classIBM:publicCompany{staticconststd::stringcompany_name="IBM";}或者在多态基类中使用静态成员有问题吗?

c++ - Concepts lite是否会改变CRTP实现静态多态的需求?

自从几年前我发现了CRTP以来,我在很多地方都使用它来为非常密集的面向计算的代码实现编译时多态性。当一个人关心运行时的通用性和最大性能时,以通用方式将成员函数“注入(inject)”到类中是很棒的。我在conceptslite上阅读/观看了几件事这将是(我希望)下一个C++标准的一部分。以更抽象和通用的方式设计功能绝对很棒,避免了我目前使用的SFINAE/std::enable_if的糟糕行。我还没有测试过实现概念的g++分支来玩弄它们,并以一种新的方式研究我喜欢的元编程方法。但也许你们中的一些人有。我的第一个想法是概念不会解决静态多态性的问题,但由于这类事情可能严重依赖技巧,我可能是

c++ - 如何避免 c++ 中多态对象的 clone() 样板代码

如果我想在C++中克隆一个多态对象(即从其他类B派生的类A的实例),最简单的方法似乎是给B一个虚拟克隆成员函数,它必须被覆盖A看起来像这样A*clone(){returnnewA(*this);}我的问题是,我发现这种不必要的样板代码,因为如果想使用C++的运行时多态特性,这几乎总是需要的。如何规避?谢谢为什么我需要这个:我的用例可以抽象为以下示例:我有一个classIntegral,它计算某个函数的积分。这样做,他们有一个成员,它是指向classMathFunction的指针。这个抽象类包含一个纯虚函数evaluate,它接受一个参数。我想实现幂函数,我将创建一个classPowFu

C++运算符重载和多态性

多态性和运算符重载混合在一起了吗?没有指针就无法实现多态性,如thisanswer中所述。而且你不能像解释的那样用指针重载运算符here.所以真的没有办法做到这一点,对吧? 最佳答案 是的。您没有正确阅读答案。这是一个简短的演示:#includeusingnamespacestd;structX{intvalue;virtualvoidoperator+=(intx){value+=x;}};structY:X{virtualvoidoperator+=(intx){value*=x;}};voiddo_stuff(X&x){x+=

C++ 多态加载/保存

我正在保存一堆不同的对象并将它们重新加载到一个文件中,这些对象都是从一个公共(public)基础派生的,显然我需要存储类名(或类似的东西)以便在重新加载时创建正确的对象类型。保存很容易:classBase{virtualstringclassName()const=0;voidsaveToFile(){write(className());...otherwritingstuff}}classDerived1:publicBase{stringclassName()const{return"Derived1";};...}classDerived2:publicBase{stringc

c++ - 用于多态调用的 x86-64 汇编器

我有C++代码:intmain(){M*m;O*o=newIO();H*h=newH("A");if(__rdtsc()%5==0){m=newY(o,h);}else{m=newZ(o,h);}m->my_virtual();return1;}虚拟调用由这个asm表示:movrax,qwordptr[x]movrax,qwordptr[rax]movrcx,qwordptr[x]callqwordptr[rax]这比我预期的vtable方法调用多了一行。所有四个ASM行都特定于多态调用吗?上面四行怎么伪读?这是完整的ASM和C++(虚拟调用在最后进行):intmain(){addby

c++ - 将多态类数据写入文件?

所以我有这些类(class)。有一个基类,但它有/将会有很多很多派生类,而这些派生类也将能够有派生类。我希望能够拥有一个将二进制数据写入文件的函数,但我不确定如何对大量派生类执行此操作。我在想一些事情:voidwriteData(ofstream&_fstream){_fstream.write()//etc..}但是每个实现此方法的派生类都必须写入其父类的所有数据,这将重复大量代码。在不重写所有以前编写的writeData()代码的情况下,最好的方法是什么? 最佳答案 您可以从派生类实现中调用基类实现:voidDerived::w